package com.lupc.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collection;





import java.util.Date;

import com.lupc.exception.DAOExcepcion;
import com.lupc.modelo.Idea;
import com.lupc.modelo.Usuario;
import com.lupc.util.ConexionBD;


public class IdeaDAO extends BaseDAO {

	public Collection<Idea> buscarIdea(String busqueda)
			throws DAOExcepcion {
		String query = "select id, titulo, descripcion, estado, archivo, fecha, key1, key2, key3, key4, asesor from idea where (titulo like ?) or (descripcion like ?) or (key1 like ?) or (key2 like ?) or (key3 like ?) or (key4 like ?)";
		Collection<Idea> lista = new ArrayList<Idea>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + busqueda + "%");
			rs = stmt.executeQuery();
			while (rs.next()) {
				Idea vo = new Idea();
				vo.setId(rs.getInt("id"));
				vo.setTitulo(rs.getString("titulo"));
				vo.setDescripcion(rs.getString("descripcion"));
				vo.setEstado(rs.getString("estado"));
				vo.setArchivo(rs.getString("archivo"));
				vo.setFecha(rs.getDate("fecha"));
				vo.setKey1(rs.getString("key1"));
				vo.setKey2(rs.getString("key2"));
				vo.setKey3(rs.getString("key3"));
				vo.setKey4(rs.getString("key4"));
				Usuario asesor= new Usuario();
				asesor.setId(rs.getInt("asesor"));
				vo.setAsesor(asesor);
				
				lista.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		System.out.println(lista.size());
		return lista;
	}

	public Boolean evaluarAprobado(Integer idIdea,String estado,Integer idAsesor) throws DAOExcepcion {
		String query = "update idea set estado=?,asesor=? where id=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, estado);
			stmt.setInt(2, idAsesor);
			stmt.setInt(3, idIdea);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return true;
	}

	public Boolean evaluarRechazado(Integer idIdea,String estado) throws DAOExcepcion {
		String query = "update idea set estado=?,asesor=? where id=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, estado);
			stmt.setInt(2, idIdea);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return true;
	}

	//Crear Idea 
	@SuppressWarnings("resource")
	public Idea crear(Idea vo) throws DAOExcepcion {
		String query = "insert into idea(titulo, descripcion, estado, archivo, fecha, key1, key2, key3, key4) values (?,?,?,?,?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getTitulo());
			stmt.setString(2, vo.getDescripcion());
			stmt.setString(3, vo.getEstado());
			stmt.setString(4, vo.getArchivo());			
			stmt.setTimestamp(5, new Timestamp((new Date()).getTime()));
			stmt.setString(6, vo.getKey1());
			stmt.setString(7, vo.getKey2());
			stmt.setString(8, vo.getKey3());
			stmt.setString(9, vo.getKey4());						
								
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
			// Obtener el ultimo id
			int id = 0;
			query = "select last_insert_id()";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			if (rs.next()) {
				id = rs.getInt(1);
			}
			vo.setId(id);

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}
	
	
	//Modificar Idea
	public Idea modificar(Idea vo) throws DAOExcepcion {
		String query = "update idea set titulo=?,descripcion=?,estado=?,archivo=?,fecha=?,key1=?,key2=?,key3=?,key4=? where id=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getTitulo());
			stmt.setString(2, vo.getDescripcion());
			stmt.setString(3, vo.getEstado());
			stmt.setString(4, vo.getArchivo());
			stmt.setTimestamp(5, new Timestamp((new Date()).getTime()));
			stmt.setString(6, vo.getKey1());
			stmt.setString(7, vo.getKey2());
			stmt.setString(8, vo.getKey3());
			stmt.setString(9, vo.getKey4());
			
			int i = stmt.executeUpdate();
			
			
			
			if (i != 1) {
				throw new SQLException("No se pudo modificar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}


	public Idea obtener(String titulo) throws DAOExcepcion {
		Idea vo = new Idea();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select id, titulo, descripcion, estado, archivo, fecha, key1, key2, key3, key4, asesor from idea where id=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, titulo);
			rs = stmt.executeQuery();
			if (rs.next()) {				
				vo.setId(rs.getInt(0));
				vo.setTitulo(rs.getString(1));
				vo.setDescripcion(rs.getString(2));
				vo.setEstado(rs.getString(3));
				vo.setArchivo(rs.getString(4));
				vo.setFecha(rs.getDate(5));
				vo.setKey1(rs.getString(6));
				vo.setKey2(rs.getString(7));
				vo.setKey3(rs.getString(8));
				vo.setKey4(rs.getString(9));
				
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	
	public Idea obtenerAsesor(Integer asesorId) throws DAOExcepcion {
		Idea vo = new Idea();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select id, titulo, descripcion, estado, archivo, fecha, key1, key2, key3, key4, asesor from idea where id=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, asesorId);
			rs = stmt.executeQuery();
			if (rs.next()) {				
				vo.setId(rs.getInt(0));
				vo.setTitulo(rs.getString(1));
				vo.setDescripcion(rs.getString(2));
				vo.setEstado(rs.getString(3));
				vo.setArchivo(rs.getString(4));
				vo.setFecha(rs.getDate(5));
				vo.setKey1(rs.getString(6));
				vo.setKey2(rs.getString(7));
				vo.setKey3(rs.getString(8));
				vo.setKey4(rs.getString(9));
				Usuario asesorObject = new Usuario();
				asesorObject.setId(rs.getInt(10));
				vo.setAsesor(asesorObject);				
				
				
				
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}
/*
	public void eliminar(int idIdea) throws DAOExcepcion {
		String query = "delete from idea WHERE id=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idCentroInformacion);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	*/
	

	public Collection<Idea> listar() throws DAOExcepcion {
		Collection<Idea> c = new ArrayList<Idea>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "select id, titulo, descripcion, estado, archivo, fecha, key1, key2, key3, key4 from idea order by titulo";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {				
				Idea vo = new Idea();
				vo.setId(rs.getInt("id"));
				vo.setTitulo(rs.getString("titulo"));
				vo.setDescripcion(rs.getString("descripcion"));
				vo.setEstado(rs.getString("estado"));
				vo.setArchivo(rs.getString("archivo"));
				vo.setFecha(rs.getDate("fecha"));
				vo.setKey1(rs.getString("key1"));
				vo.setKey2(rs.getString("key2"));
				vo.setKey3(rs.getString("key3"));
				vo.setKey4(rs.getString("key4"));
				c.add(vo);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}
	
	
	
	public Collection<Idea> listar(String titulo,String estado) throws DAOExcepcion {
		Collection<Idea> c = new ArrayList<Idea>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "select id, titulo, descripcion, estado, archivo, fecha, key1, key2, key3, key4 from idea where titulo like ?";
			
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%"+titulo+"%");
			
			if (estado!=null && !estado.equals("") ) {
				query += " and estado=?";
				stmt.setString(2, "%"+estado+"%");
			}
			
			rs = stmt.executeQuery();
			
			while (rs.next()) {
				Idea vo = new Idea();
				vo.setId(rs.getInt("id"));
				vo.setTitulo(rs.getString("titulo"));
				vo.setDescripcion(rs.getString("descripcion"));
				vo.setEstado(rs.getString("estado"));
				vo.setArchivo(rs.getString("archivo"));
				vo.setFecha(rs.getDate("fecha"));
				vo.setKey1(rs.getString("key1"));
				vo.setKey2(rs.getString("key2"));
				vo.setKey3(rs.getString("key3"));
				vo.setKey4(rs.getString("key4"));
				c.add(vo);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}
	

}